/*************************************************************************************************
 *
 *                                  Hex字符串与Byte[]互转函数集
 *
 **************************************************************************************************/

package com.cofdet.modbusdebugger;

import java.nio.ByteBuffer;

public class HexStrByte {
    /**
     * 字符串换成数据
     * @param String ch 待转换的原始数据,0-9 a-f或A-F
     * @return 0x00-0x0f正确，-1数据错误
     */
    public static int Char2Byte(char ch)
    {
        int Data;
        if((ch >= '0') && (ch <= '9'))
            Data = (ch - '0');
        else if((ch >= 'a') && (ch <= 'f'))
            Data = (ch - 'a') + 10;
        else if((ch >= 'A') && (ch <= 'F'))
            Data = (ch - 'A') + 10;
        else Data = -1;
        return Data;
    }

    /**
     * 十六进制字符串换成Byte数组
     * @param String str 待转换的原始数据,格式如[61 6C 6B]
     * @param ByteBuffer bAry 转换后要插入的数据流
     */
    public static void HexStr2Byte(final String str, ByteBuffer bAry)
    {
        boolean haveH = false; //是否有高位了
        int Data = 0;
        for (int i = 0; i < str.length(); i++)
        {
            int Resume = Char2Byte(str.charAt(i));
            if(Resume < 0) continue; //转换不成功
            if(haveH) {//已转换一半了
                Data += Resume;
                bAry.put((byte)Data);
                haveH = false;
            }
            else {
                Data = Resume * 16;
                haveH = true;
            }
        }
    }

    /**
     * 数据换成字符串
     * @param byte Data 待转换的原始数据,如0x3e
     * @param StringBuffer Str 转换后追加入字符缓冲,调用一次增加两个个即"3E"
     */
    public static void Byte2Char(byte Byte, StringBuffer Str)
    {
        char Ch;
        int Data = (Byte & 0xf0) >> 4;
        if(Data >= 10) Ch = (char)('A' + (Data - 10));
        else Ch = (char)('0' + Data);
        Str.append(Ch);
        Data = Byte & 0x0f;
        if(Data >= 10) Ch = (char)('A' + (Data - 10));
        else Ch = (char)('0' + Data);
        Str.append(Ch);
    }

    /**
     * Byte数组转换为十六进制字符串
     * @param byte[] bAry 待转换的原始数据流
     * @param byte[] Len 待转换的原始数据流有效长度
     * @return StringBuffer 转换后的String流格式如[61 6C 6B]
     */
    public static StringBuffer Byte2HexStr(final byte[] bAry, int Offset, int Len)
    {
        StringBuffer Str = new StringBuffer(Len * 3);
        int End = Len + Offset;
        for (; Offset < End; Offset++)
        {
            Byte2Char(bAry[Offset], Str);
            Str.append(' '); //空格
        }
        Str.deleteCharAt(Str.length() - 1); //去掉最后空格
        return Str;
    }



}

